/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import com.toedter.calendar.JDateChooser;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.swing.*;
import otcapp.controlador.jdialogs.consultarPieza.BuscarInternoJDialog;
import otcapp.controlador.jinternalFrame.IngresarPiezaPantallaNew;
import otcapp.controlador.modeloAutocompletar.ModeloAutoCompletarInterno;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaAsuntos;
import otcapp.controlador.modeloTablas.ModeloTablaConclusionResolucion;
import otcapp.controlador.modelocombobox.*;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.dto.InternoDTO;
import otcapp.dto.PiezaDTO;
import otcapp.dto.ResolucionDTO;
import otcapp.dto.SeleccionAsuntoDTO;
import otcapp.entidades.Asunto;
import otcapp.entidades.ResolucionResultado;
import otcapp.experto.ExpertoIngresarPieza;
import otcapp.experto.excepciones.ExpertoPiezaException;
import otcapp.fabricas.FabricaExpertos;
import otcapp.utiles.tablas.CellEditorCheckBox;
import otcapp.utiles.tablas.CellRenderCheckbox;
import otcapp.utiles.tablas.RenderTablaAsuntos;

/**
 *
 * @author diego
 */
public class IngresarPiezaControlador implements Controlador {

    private IngresarPiezaPantallaNew pantalla;
    private ExpertoIngresarPieza expertoIngresarPiezas;
    private BuscarInternoJDialog buscarInternoJDialog;
    private PiezaDTO nuevaPieza = null;
    private InternoDTO internoDTO;
    private boolean ingresandoInterno; //para saber si se esta ingresando un interno
    private boolean modificando; //permite saber si la pieza es nueva o se esta modificando

    public IngresarPiezaControlador() {

        pantalla = new IngresarPiezaPantallaNew();
        expertoIngresarPiezas = (ExpertoIngresarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.INGRESAR_PIEZA);
        pantalla.getCabecera().getTítulo().setText("Ingresar Pieza");
        pantalla.getCabecera().getIcono().setIcon(new ImageIcon(this.getClass().getResource("../utiles/imagenes/iconos/Documents-2-48.png").getPath()));
        buscarInternoJDialog = new BuscarInternoJDialog(((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        buscarInternoJDialog.setLocationRelativeTo(null);


        pantalla.getBtnBuscarInterno().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                //iniciarAutocompletarInternos();
                buscarInternoJDialog.getAutoCompletar().setTexto("");
                buscarInternoJDialog.setVisible(true);
            }
        });

        pantalla.getBtnGuardarPieza().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                guardarPieza();
            }
        });

        pantalla.getCbxTipoPieza().addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent e) {
                verificarTipoPieza();
            }
        });

        pantalla.getBtnAddConclucion().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                agregarConclusion();
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });

        /**
         * *
         * Buscar Interno JDialog
         *
         */
        buscarInternoJDialog.getBtnNuevoInterno().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                inicarAbmInternos();
            }
        });

        buscarInternoJDialog.getBtnSeleccionar().addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                seleccionarInterno((InternoDTO) buscarInternoJDialog.getAutoCompletar().getItemSeleccionado());
                buscarInternoJDialog.setVisible(false);
            }
        });


    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);
        iniciarCombobox();
        pantalla.getTblAsuntos().setModel(new ModeloTablaAsuntos());
        mostrarAsuntos();
        pantalla.getjPanelBeneficios().setVisible(false);
        pantalla.getTblAsuntos().setDefaultRenderer(Object.class, new RenderTablaAsuntos());
        pantalla.getTblAsuntos().getColumn("Seleccionar").setCellRenderer(new CellRenderCheckbox());
        pantalla.getTblAsuntos().getColumn("Seleccionar").setCellEditor(new CellEditorCheckBox(new JCheckBox()));
        pantalla.getTblAsuntos().getColumn("Seleccionar").setMaxWidth(100);
        pantalla.getTblAsuntos().getColumn("Seleccionar").setMinWidth(100);
        pantalla.getTblConcluciones().setModel(new ModeloTablaConclusionResolucion());

        iniciarAutocompletarInternos();

    }

    public void iniciarCombobox() {
        pantalla.getCbxOficinaInicio().setModel(new ModeloComboOficina(expertoIngresarPiezas.buscarOficinas()));
        pantalla.getCbxSede().setModel(new ModeloComboSede(expertoIngresarPiezas.buscarSedes()));
        pantalla.getCbxTipoPieza().setModel(new ModeloComboTipoPieza(expertoIngresarPiezas.buscarTiposPiezas()));
        pantalla.getCbxAddBeneficio().setModel(new ModeloComboBeneficios(expertoIngresarPiezas.buscarBeneficios()));
        pantalla.getCbxAddResultado().setModel(new ModeloComboResultadoResolucion(expertoIngresarPiezas.buscarResultadosResolucion()));

    }

    public void iniciarAutocompletarInternos() {
        try {
            ModeloAutoCompletarInterno modeloAutocompletar = new ModeloAutoCompletarInterno(expertoIngresarPiezas.buscarInterno(null));
            buscarInternoJDialog.getAutoCompletar().setModelo(modeloAutocompletar);
        } catch (ExpertoPiezaException ex) {
            System.out.println("No hay internos en la base de datos:\nMensaje: " + ex.getMessage());
        }
    }

    @Override
    public void finalizar() {
        pantalla.setVisible(false);
        if (modificando) {
            ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.CONSULTAR_PIEZAS);
        }
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        pantalla.setVisible(true);
        if (ingresandoInterno) {
            iniciarAutocompletarInternos();
            InternoDTO ultimInterno = ((IngresarInternoControlador) ((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getControlador(ControladorPrincipal.controlador.INTERNOS)).getUltimoInternoGuardado();
            seleccionarInterno(ultimInterno);
            ingresandoInterno = false;
        }
    }

    public void mostrarAsuntos() {
        List<SeleccionAsuntoDTO> asuntos = new ArrayList<>();
        for (Asunto asunto : expertoIngresarPiezas.buscarAsuntos()) {
            SeleccionAsuntoDTO elemento = new SeleccionAsuntoDTO();
            elemento.setAsunto(asunto);
            asuntos.add(elemento);
        }

        ((ModeloTabla) pantalla.getTblAsuntos().getModel()).setListaElementos(asuntos);
    }

    private void verificarTipoPieza() {
        if (pantalla.getCbxTipoPieza().getSelectedItem().equals("Cédula")) {
            pantalla.getTxtExpediente().setEnabled(true);
        } else if (pantalla.getCbxTipoPieza().getSelectedItem().equals("Resolución")) {
            pantalla.getjPanelBeneficios().setVisible(true);
        } else {
            pantalla.getTxtExpediente().setEnabled(false);
            pantalla.getjPanelBeneficios().setVisible(false);
        }
    }

    public void seleccionarInterno(InternoDTO dto) {
        this.internoDTO = dto;
        pantalla.getTxtInterno().setText(internoDTO.getApellidoNombre());
    }

    public void guardarPieza() {

        try {
            nuevaPieza = expertoIngresarPiezas.ingresarPieza(recogerDatosPantalla(nuevaPieza));
        } catch (ExpertoPiezaException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.WARNING_MESSAGE);
            return;
        }
        limpiarCampos();
        JOptionPane.showMessageDialog(pantalla, "Pieza guardada correctamente", "AVISO", JOptionPane.INFORMATION_MESSAGE);
        if (modificando) {
            finalizar();
        }

    }

    /**
     * guarda los datos de la pantalla en un dto de pieza,
     *
     * @param pieza este parámetro se utiliza para copiar los datos en este dto.
     * @return
     */
    private PiezaDTO recogerDatosPantalla(PiezaDTO pieza) {

        PiezaDTO nuevaPiezaDTO;
        if (pieza != null) {
            nuevaPiezaDTO = pieza;
        } else {
            nuevaPiezaDTO = crearDTOPieza(pantalla.getCbxTipoPieza().getSelectedItem().toString());
        }
        if (pantalla.getCbxTipoPieza().getSelectedIndex() != 0) {
            nuevaPiezaDTO.setTipo(((ModeloComboTipoPieza) pantalla.getCbxTipoPieza().getModel()).getTipoSeleccionado());
        }
        nuevaPiezaDTO.setInicioPieza(((ModeloComboOficina) pantalla.getCbxOficinaInicio().getModel()).getOficinaSeleccionada());
        nuevaPiezaDTO.setSede(((ModeloComboSede) pantalla.getCbxSede().getModel()).getSedeSeleccionada());
        nuevaPiezaDTO.setIdentificacion(pantalla.getTxtIdentificacionPieza().getText());
        nuevaPiezaDTO.setNroExpediente(pantalla.getTxtExpediente().getText());
        if (internoDTO != null) {
            nuevaPiezaDTO.setInterno(internoDTO);
        }
        nuevaPiezaDTO.setEmplazamientoDias(pantalla.getTxtEmplazamientoDias().getText());
        nuevaPiezaDTO.setEmplazamientoHoras(pantalla.getTxtEmplazamientoHoras().getText());
        nuevaPiezaDTO.setObservaciones(pantalla.getTxtObservaciones().getText());
        if (pantalla.getjDateFechaEntrada().getDate() != null) {
            nuevaPiezaDTO.setFechaEntrada(new Date(pantalla.getjDateFechaEntrada().getDate().getTime()));
        }
        List<Asunto> asuntosSeleccionados = new ArrayList<>();
        for (Object fila : ((ModeloTablaAsuntos) pantalla.getTblAsuntos().getModel()).getListaElementos()) {
            SeleccionAsuntoDTO dtoSeleccion = (SeleccionAsuntoDTO) fila;
            if (dtoSeleccion.isSelected()) {
                asuntosSeleccionados.add(dtoSeleccion.getAsunto());
            }
        }
        nuevaPiezaDTO.setAsuntos(asuntosSeleccionados);
        if (nuevaPiezaDTO instanceof ResolucionDTO) {
            ((ResolucionDTO) nuevaPiezaDTO).setConclusiones(((ModeloTabla) pantalla.getTblConcluciones().getModel()).getListaElementos());
        }
        return nuevaPiezaDTO;
    }

    private void limpiarCampos() {
        for (Component component : pantalla.getFormulario().getComponents()) {
            if (component instanceof JTextField) {
                ((JTextField) component).setText("");
            } else if (component instanceof JComboBox) {
                ((JComboBox) component).setSelectedIndex(0);
            } else if (component instanceof JDateChooser) {
                ((JDateChooser) component).setDate(null);
            }

        }
        for (Object object : ((ModeloTablaAsuntos) pantalla.getTblAsuntos().getModel()).getListaElementos()) {
            SeleccionAsuntoDTO asunto = (SeleccionAsuntoDTO) object;
            asunto.setSelected(false);
            ((ModeloTablaAsuntos) pantalla.getTblAsuntos().getModel()).fireTableDataChanged();
        }
        nuevaPieza = null;
        internoDTO = null;
    }

    private void inicarAbmInternos() {
        ingresandoInterno = true;
        ((IngresarInternoControlador)((ControladorPrincipal)FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.INTERNOS)).setRetornoIngresarPieza(true);
        buscarInternoJDialog.setVisible(false);
    }

    private PiezaDTO crearDTOPieza(String selectedItem) {
        switch (selectedItem) {
            case "Resolución":
                return new ResolucionDTO();
            default:
                return new PiezaDTO();
        }
    }

    private void agregarConclusion() {
        if (pantalla.getCbxAddBeneficio().getSelectedIndex() > 0 && pantalla.getCbxAddResultado().getSelectedIndex() > 0) {
            ResolucionResultado conclusion = new ResolucionResultado();
            conclusion.setBeneficio(((ModeloComboBeneficios) pantalla.getCbxAddBeneficio().getModel()).getBeneficioSeleccionado());
            conclusion.setResultado(((ModeloComboResultadoResolucion) pantalla.getCbxAddResultado().getModel()).getResultadoSeleccionado());
            ((ModeloTablaConclusionResolucion) pantalla.getTblConcluciones().getModel()).addRow(conclusion);
            pantalla.getCbxAddBeneficio().setSelectedIndex(0);
            pantalla.getCbxAddResultado().setSelectedIndex(0);
        }
    }

    public void editarPieza(PiezaDTO pieza) {
        modificando = true;
        nuevaPieza = pieza;
        mostrarDatosPieza();
    }

    public void mostrarDatosPieza() {
        pantalla.getCbxTipoPieza().setSelectedItem(nuevaPieza.getTipo().getNombreTipo());
        pantalla.getCbxSede().setSelectedItem(nuevaPieza.getSede().getNombreSede());
        if (nuevaPieza.getNroExpediente() != null) {
            pantalla.getTxtExpediente().setText(nuevaPieza.getNroExpediente());
        }
        pantalla.getjDateFechaEntrada().setDate(nuevaPieza.getFechaEntrada());
        pantalla.getTxtInterno().setText(nuevaPieza.getInterno().getApellidoNombre());
        pantalla.getCbxOficinaInicio().setSelectedItem(nuevaPieza.getInicioPieza().getNombreOficina());
        pantalla.getTxtIdentificacionPieza().setText(nuevaPieza.getIdentificacion());
        pantalla.getTxtEmplazamientoDias().setText(nuevaPieza.getEmplazamientoDias());
        pantalla.getTxtEmplazamientoHoras().setText(nuevaPieza.getEmplazamientoHoras());
        pantalla.getTxtObservaciones().setText(nuevaPieza.getObservaciones());

        for (Asunto asunto : nuevaPieza.getAsuntos()) {
            seleccionarAsunto(asunto);
        }

        if (nuevaPieza instanceof ResolucionDTO) {
            ((ModeloTabla) pantalla.getTblConcluciones().getModel()).setListaElementos(((ResolucionDTO) nuevaPieza).getConclusiones());
        }


    }

    public void seleccionarAsunto(Asunto asunto) {
        for (Object object : ((ModeloTablaAsuntos) pantalla.getTblAsuntos().getModel()).getListaElementos()) {
            SeleccionAsuntoDTO seleccion = (SeleccionAsuntoDTO) object;
            if (seleccion.getAsunto().getId() == asunto.getId()) {
                seleccion.setSelected(true);
            }
        }
    }
}
